package 笔试做题;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * 题目描述:
 * 两行, 第一行三个数, 第一个表示数组长度, 第二个k1, 第三个k2
 * 第二行是数组的值, 求数组的一个子集, 其和可以被k1整除, 不能被k2整除, 要求最大的这么个和, 同时计算出所有可能的选择方法的数量
 * 5 3 4
 * 6 8 -2 -5 2
 * 返回9 2
 */
public class S220319_美团4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] line1 = sc.nextLine().split(" ");
        String[] line2 = sc.nextLine().split(" ");
        int k1 = Integer.parseInt(line1[1]);
        int k2 = Integer.parseInt(line1[2]);

        List<Integer> numList = new ArrayList<>();
        int totalLen = Integer.parseInt(line1[0]);
        for (int i = 0; i < totalLen; i++) {
            numList.add(Integer.parseInt(line2[i]));
        }
        Collections.sort(numList);
        // 统计最大能产生的和
        int maxSum = 0;
        for(int i = 0; i < totalLen; i++){
            if(numList.get(i) > 0){
                maxSum += numList.get(i);
            }
        }
        for(int curSum = maxSum; curSum >= 0; curSum --){
            // 倒着数, 找第一个符合的
            if(curSum % k1 == 0 && curSum % k2 != 0){
                // 找一个子集, 和为curSum
                lists = new ArrayList<>();
                List<Integer> list = new ArrayList<>();
                dfs(list, numList, curSum, 0);
                if(lists.size() != 0){
                    System.out.println(curSum + " " + lists.size());
                    break;
                }
            }
        }

    }
    public static List<List<Integer>> lists = new ArrayList<>();

    private static void dfs(List<Integer> list, List<Integer> numList, int target, int start) {
        //递归的终止条件
        if (target < 0) {
            return;
        }
        if (target == 0) {
            lists.add(new ArrayList<>(list));
        } else {
            for (int i = start; i < numList.size(); i++) {

                if (i != start && numList.get(i).equals(numList.get(i - 1))) {
                    // 跳过相同的情况
                    continue;
                }
                list.add(numList.get(i));
                dfs(list, numList, target - numList.get(i), i + 1);
                list.remove(list.size() - 1);
            }
        }
    }
}
